'use strict';

const Service = require('egg').Service;

class CommentService extends Service {


  // 获取列表
  async getlist(payload) {
    const { app } = this;
    const Op = app.Sequelize.Op;
    const { pageNum, pageSize, article_id, user_id, status, parentId, keywords, begin_pubdate, end_pubdate } = payload;
    const where = {};
    if (article_id) { where.article_id = article_id; }// 根据文章id查询
    if (user_id) { where.user_id = user_id; }// 根据评论用户id查询
    if (status) { where.status = status; }// 根据评论状态查询
    if (parentId) { where.parentId = parentId; }// 根据评论 或回复查询 ，评论文章为0
    if (keywords) { where.content = { [Op.like]: `%${keywords}%` }; }// 根据评论内容查询
    if (begin_pubdate && end_pubdate) { // 根据评论时间查询
      where.createdAt = { [Op.between]: [ begin_pubdate, end_pubdate ] };
    }// 查询这个字段-xx之间  }
    try {
      const offset = (pageNum - 1) * pageSize;
      const { count, rows } = await app.model.NewsComment.findAndCountAll({
        where,
        order: [
          [ 'createdAt', 'desc' ],
        ],
        include: [
          {
            model: this.app.model.Article,
            // attributes: [ 'title','id','category_id' ], // 只显示哪些字段
            as: 'comment_article',
            include: [
              {
                model: this.app.model.ArticleCategory,
                as: 'category',
                attributes: [ 'name' ], // 只显示哪些字段
                // through: { attributes: [] }, // 排除中间表
              },
              {
                model: this.app.model.User,
                as: 'user',
                attributes: [ 'user_name' ], // 只显示哪些字段
                // through: { attributes: [] }, // 排除中间表
              },
            ],
          },
          {
            model: this.app.model.User,
            attributes: [ 'user_name', 'avatar' ], // 只显示哪些字段
            as: 'comment_user',
          },
          {
            model: this.app.model.User,
            attributes: [ 'user_name', 'avatar' ], // 只显示哪些字段
            as: 'reply_user',
          },
          // {
          //   model: this.app.model.User,
          // as: 'comment_user',
          //   attributes: [ 'user_name' ], // 只显示哪些字段
          //   // through: { attributes: [] }, // 排除中间表
          // },
        ],
        // raw: true,
        offset,
        limit: pageSize * 1,

      });
      return {
        pageNum,
        pageSize,
        total: count,
        // list: this.ctx.helper.toTree(rows),
        list: rows,
      };
    } catch (error) {
      console.error(error);
      return null;
    }
  }

  // // 删除
  // async del(id) {
  //   const { app } = this;
  //   return await app.model.NewsComment.destroy({ where: { id } });
  // }

  // 删除
  async del(payload) {
    const { app } = this;
    const isParentId = await app.model.NewsComment.findAll({
      where: { parentId: payload.ids },
    });
    // 如果当前删除id有回复;
    if (isParentId.length > 0) {
      // this.ctx.helper.error('删除失败，当前评论下有回复', 400);
      const err = new Error('删除失败，当前评论下有回复。');
      err.parent = {};
      err.parent.errno = 1451;
      throw err;
    }

    // 查询要删除的是哪些评论
    const iddd = await app.model.NewsComment.findAll({
      where: { id: payload.ids },
    });
    // 根据评论信息里的文章ID  循环文章id到新数组
    const newList = iddd.map(item => {
      return item.article_id;
    });
    // 数组去重 获取多篇文章id
    const repeatTime = {};
    const result = newList.reduce((array, item) => {
      if (repeatTime[item]) {
        repeatTime[item]++;
        return array;
      }
      repeatTime[item] = 1;
      return [ ...array, item ];
    }, []);
    // 删除评论
    const res = await app.model.NewsComment.destroy({ where: { id: payload.ids } });
    console.log('删除了几条', res);
    // TODO: 次逻辑只对批量删除同一篇文章起作用，如果批量删除多篇文章下的评论，多篇文章下的评论统计都会减少删除的条数
    // 删除了几条评论 文章评论总数就减几条
    await app.model.Article.decrement({ comment_count: res }, { where: { id: result } });
    return res;
  }


  // 修改
  async update(id, payload) {
    const { app } = this;
    return await app.model.NewsComment.update(payload, { where: { id } });
  }

  // 根据id获取信息
  async getInfo(id) {
    return await this.app.model.NewsComment.findByPk(id);
  }


}

module.exports = CommentService;
